Сокрытие
Краткие правила были описаны в Наследование, сейчас будут примеры
Сокрытие поля
class Base {
protected int protField = 3;
public int pubField = 4;
public static int statField = 5;
}
class Extended extends Base {
protected float protField = 7.0f;
public float pubField = 8.0f;
public static int statField = 9;
print(this.protField) // 7.0
print(super.protField) // 3
print(this.pubField) // 8
print(super.pubField) // 4
print(statField) // 9
print(Base.statFiel) // 5
}
Если имя поля в подклассе и в суперклассе одинаковое
- Поле подкласса скрывает поле суперкласса
- Статическое поле суперкласса доступно по имени класса
BaseClass.staticField - Нестатическое поле суперкласса доступно с помощью super:
super.instanceField - Скрытое поле может иметь другой тип
- Поле может стать
static, если было не статик. И наоборот
Сокрытие метода
Только для статиков
class Base {
public int getVal() {
return 1;
}
public static int statVal() {
return 3;
}
}
class Ext extends Base {
public int getVal() {
return 2;
}
public static int statVal() {
return 4;
}
}
Base b = new Base();
Ext e = new Ext();
Base be = new Ext();
print(b.statVal()) // 3
print(e.statVal()) // 4
print(be.statVal()) // 3 - по типу ссылки для статики
print(b.getVal()) // 1
print(e.getVal()) // 2
print(be.getVal()) // 2 - просто переопределение
Если сигнатура (имя и параметры) статического метода в подклассе и в суперклассе одинаковая
- Статический метод подкласса скрывает метод суперкласса
- Статический метод суперкласса доступен по имени класса
BaseClass.staticMethod() - Модификатор доступа может только расшириться (правило как в переопределении)
- Возвращаемое значение должно быть ковариантным (тоже как в переопределении)
- Менять статик на нон-статик и обратно запрещено
P.S.
Сокрытие методов в целом плохая практика, обращаться к статике по объектам - плохой тон